package com.edu.exam.enums.common;

import com.edu.exam.enums.core.BaseEnum;

import java.util.Arrays;

/**
 * 执行模式枚举
 *
 * 统一的执行模式管理，用于各种需要模式控制的场景
 * 替代分散在各个实体中的重复执行模式定义
 *
 * @author System
 * @version 1.0.0
 * @since 2025-11-13
 */
public enum ExecutionMode implements BaseEnum {

    /**
     * 手动模式
     */
    MANUAL("MANUAL", "手动模式"),

    /**
     * 自动模式
     */
    AUTOMATIC("AUTOMATIC", "自动模式"),

    /**
     * 半自动模式
     */
    SEMI_AUTOMATIC("SEMI_AUTOMATIC", "半自动模式"),

    /**
     * 批量模式
     */
    BATCH("BATCH", "批量模式"),

    /**
     * 实时模式
     */
    REAL_TIME("REAL_TIME", "实时模式"),

    /**
     * 离线模式
     */
    OFFLINE("OFFLINE", "离线模式"),

    /**
     * 在线模式
     */
    ONLINE("ONLINE", "在线模式"),

    /**
     * 调试模式
     */
    DEBUG("DEBUG", "调试模式"),

    /**
     * 生产模式
     */
    PRODUCTION("PRODUCTION", "生产模式"),

    /**
     * 测试模式
     */
    TEST("TEST", "测试模式"),

    /**
     * 模拟模式
     */
    SIMULATION("SIMULATION", "模拟模式"),

    /**
     * 计划模式
     */
    SCHEDULED("SCHEDULED", "计划模式"),

    /**
     * 交互模式
     */
    INTERACTIVE("INTERACTIVE", "交互模式"),

    /**
     * 后台模式
     */
    BACKGROUND("BACKGROUND", "后台模式"),

    /**
     * 前台模式
     */
    FOREGROUND("FOREGROUND", "前台模式"),

    /**
     * 安全模式
     */
    SAFE("SAFE", "安全模式"),

    /**
     * 快速模式
     */
    FAST("FAST", "快速模式"),

    /**
     * 精确模式
     */
    PRECISE("PRECISE", "精确模式");

    private final String code;
    private final String description;

    ExecutionMode(String code, String description) {
        this.code = code;
        this.description = description;
    }

    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDescription() {
        return description;
    }

    public static ExecutionMode fromCode(String code) {
        return Arrays.stream(values())
                .filter(e -> e.getCode().equals(code))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("Unknown execution mode code: " + code));
    }
    @Override
    public String toString() {
        return description;
    }
}